package com.per.mybootall.service.impl;


import com.per.mybootall.dao.CategoryMapper;
import com.per.mybootall.dao.ProductMapper;
import com.per.mybootall.pojo.Category;
import com.per.mybootall.pojo.Product;
import com.per.mybootall.pojo.Test;
import com.per.mybootall.pojo.Test2;
import com.per.mybootall.service.HomeLoadInter;
import com.per.mybootall.vo.ProductCarVO;
import com.per.mybootall.vo.ProductVO;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import javax.xml.crypto.Data;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class HomeLoadimpl implements HomeLoadInter {
    @Autowired
    private ProductMapper productmapper;
//    @Autowired
//    private  ProductVO proVO;
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;
//    @Autowired
//    private Product pro;
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public List<ProductVO> selectProductMessage(){

        Product pro=new Product();
        //字符串的序列化器
        RedisSerializer redisSerializer=new StringRedisSerializer();
        redisTemplate.setKeySerializer(redisSerializer);

        List<ProductVO> listredis=new ArrayList<ProductVO>();
         listredis=  (List<ProductVO>)redisTemplate.opsForValue().get("HomeLoadMassage");

        if(null==listredis){
            synchronized (this){
                 listredis=  (List<ProductVO>)redisTemplate.opsForValue().get("HomeLoadMassage");
                if(null==listredis){
                    System.out.println("缓存咩有的时候："+listredis);
                    List<ProductVO> listrediss=new ArrayList<ProductVO>();

                    for(long i=1;i<4;i++){
                        ProductVO proVO=new ProductVO();
                         pro= productmapper.selectByPrimaryKey(i);
                        proVO.setName(pro.getName());
                        proVO.setSubtitle(pro.getSubtitle());
                        proVO.setMainImage(pro.getMainImage());
                        proVO.setSubImage(pro.getSubImage());
                        proVO.setPrick(pro.getPrick());
                        proVO.setStock(pro.getStock());
                        System.out.println(proVO.toString());

                       listrediss.add(proVO);
                        System.out.println("listredis:"+listrediss);
                    }
                    System.out.println("all:"+listrediss);
                    redisTemplate.opsForValue().set("HomeLoadMassage",listrediss);
                    return listrediss;
                }
                System.out.println("缓存查询有的时候："+listredis);
                System.out.println("home页面加载的数据:"+listredis.toString());
                return listredis;
            }
            }
        System.out.println("return前面的listredis:"+listredis);

        return listredis;
            }


        @Override
        public List<ProductVO> selectCondition(String condition, String usertokens, String whoareuser){

            RedisSerializer redisSerializer=new StringRedisSerializer();
            redisTemplate.setKeySerializer(redisSerializer);

                String usertoken=usertokens.substring(1,usertokens.length()-1);
              //拿到该用户存在redis的uuid的值
                System.out.println("whoareuser>>>>>>>>>>:"+whoareuser);

                String who=whoareuser.substring(1,whoareuser.length()-1);
                String userTokenInRedis= (String) redisTemplate.opsForValue().get(who);

                System.out.println("redis的token取值："+userTokenInRedis+",传进来的token"+usertoken);

                if(usertoken.equals(userTokenInRedis)){
                    //身份验证通过====>>>查询一个id的list然后根据list查询所有数据
                    System.out.println("身份验证通过");



                  List<Category> list=categoryMapper.selectProductIdForName(condition);

                    List<ProductVO> listproduct=new ArrayList<ProductVO>();
                    System.out.println("===================>>>>>"+list.size());
                    System.out.println("===================>>>>>"+list.get(0).getId());
                  for(int i=0;i<list.size();i++){
                      Product pro=new Product();
                      ProductVO provo=new ProductVO();
                      int site=list.get(i).getId();
                      System.out.println("产品查询的iid:"+site);
                    pro=   productmapper.selectAllForId(site);

                    provo.setId(pro.getId());
                   provo.setName(pro.getName()); provo.setSubtitle(pro.getSubtitle());
                   provo.setStock(pro.getStock());provo.setPrick(pro.getPrick());
                   provo.setMainImage(pro.getMainImage());provo.setSubImage(pro.getSubImage());

                   listproduct.add(provo);
                      System.out.println("provo"+provo);
                  }
                    System.out.println("listproduct:"+listproduct);
                  return listproduct;
                }
                //身份验证不通过（请求的人未登录）
            System.out.println("身份验证不通过");
                    return null;

        }



        /*在商品页面点击加入购物车===>>>没有就新增，有就数量相加*/
        @Override
        public String addCartBuy(String thisuserid,String productId, String usertoken, String whoareuser,int productNumber){
           String whoareusers=whoareuser.substring(1,whoareuser.length()-1);
            String userTokenInRedis= (String) redisTemplate.opsForValue().get(whoareusers);
            String usertokens=usertoken.substring(1,usertoken.length()-1);

            if(usertokens.equals(userTokenInRedis)){
                //身份验证通过====>>>查询一个id的list然后根据list查询所有数据
                System.out.println("身份验证通过");

                // HASH存储(userid,productid,productnumber)==>没有商品时候的新增
                if(redisTemplate.opsForHash().get(thisuserid,productId)==null){
                    //  redis购物车里面无该商品的时候===>>add product
                    System.out.println("购物车里无该商品的时候："+productNumber);
                    redisTemplate.opsForHash().put(thisuserid,productId,productNumber);
                    System.out.println("购物车里add商品success");
                }else{
                    //  redis里面有该商品的时候===>>add number

                    int protNumber= (int) redisTemplate.opsForHash().get(thisuserid,productId);
                    protNumber=protNumber+productNumber;
                    System.out.println("购物车里有该商品的时候："+protNumber);
                    System.out.println("thisuserid:"+thisuserid+";productId:"+productId+";protNumber:"+protNumber);
                    redisTemplate.opsForHash().put(thisuserid,productId,protNumber);
                }

                String msg="添加成功";
                return msg;
            }
            String msg="身份验证不通过";
            return msg;
        }


        /*在购物车展示数量的时候，用户可以减少商品数量*/
    @Override
    public String whenShowProductNumberLess(String usertoken, String whoareuser,String thisuserid,String productId){

      String usertokens=usertoken.substring(1,usertoken.length()-1);
      String whoare=whoareuser.substring(1,whoareuser.length()-1);

      String who=(String)redisTemplate.opsForValue().get(whoare);

      if(usertokens.equals(who)){
          try{
              int proNumber=(int) redisTemplate.opsForHash().get(thisuserid,productId);
              if(proNumber==1){
                  redisTemplate.opsForHash().delete(thisuserid,productId);
                  String msg="当前商品数量为0，已自动移除该商品";
                  return msg;
              }
              int produNumber=proNumber-1;
              redisTemplate.opsForHash().put(thisuserid,productId,produNumber);

          }catch (Exception e){
              System.out.println("购物车商品数量减少操作异常");
              String msg="购物车商品数量减少操作异常";
              return msg;
          }
          String msg="购物车商品数量减少操作成功";
          return msg;
      }
      String msg="身份验证不通过";
      return msg;

    }



    /*在购物车展示数量的时候，用户可以增加商品数量*/
    @Override
    public String whenShowProductNumberAdd(String usertoken, String whoareuser,String thisuserid,String productId){
        String usertokens=usertoken.substring(1,usertoken.length()-1);
        String whoare=whoareuser.substring(1,whoareuser.length()-1);

        String who=(String)redisTemplate.opsForValue().get(whoare);
        if(usertokens.equals(who)){
            try{
                int proNumber=(int) redisTemplate.opsForHash().get(thisuserid,productId);

                if(proNumber==10){
                    String msg="最大数量为10，不如先去结账吧";
                    return msg;
                }

                int produNumber=proNumber+1;
                redisTemplate.opsForHash().put(thisuserid,productId,produNumber);
            }catch (Exception e){
                System.out.println("购物车商品数量增加操作异常");
                String msg="购物车商品数量增加操作异常";
                return msg;
            }
            String msg="购物车商品数量增加操作成功";
            return msg;
        }

       String msg="身份验证不通过";
        return msg;
    }


    /*购物车展示*/
    @Override
    public List<ProductCarVO> showCarBuy(String thisuserid, String usertoken, String whoareuser){

       List<ProductCarVO> volist=new ArrayList<ProductCarVO>();

       String whareus=whoareuser.substring(1 ,whoareuser.length()-1);

        String who=(String) redisTemplate.opsForValue().get(whareus);

        String usertokens=usertoken.substring(1,usertoken.length()-1);

        if (usertokens.equals(who)){
            System.out.println("身份验证通过");

        Map<Object, Object> map=redisTemplate.opsForHash().entries(thisuserid);

        for(Map.Entry<Object, Object> entry:map.entrySet()){

            System.out.println("商品id:"+entry.getKey()+";商品数量:"+entry.getValue());
            //现在需要根据商品id去查询出商品名字，商品图片+++商品数量(注意:
            // entry.getKey()为String;entry.getValue()为int;)

            Product product= productmapper.selectAllForId(Integer.valueOf((String) entry.getKey()) );
            ProductCarVO productCarVO=new ProductCarVO();
            productCarVO.setId(product.getId());    productCarVO.setMainImage(product.getMainImage());
            productCarVO.setSubImage(product.getSubImage());  productCarVO.setName(product.getName());
            productCarVO.setPrick(product.getPrick());

            productCarVO.setProductNumber((int) entry.getValue());

            volist.add(productCarVO);
        }
            System.out.println("购物车展示传输数据:"+volist);
            return volist;
        }
        System.out.println("身份验证不通过");
        return null;
    }


//    public static void main(String[] args) {
//        List<Test2> res=new ArrayList<>();
//
//        List<Test> a=new ArrayList<>();
//        a.add(new Test("time",1));
//        a.add(new Test("time",5));
//        a.add(new Test("time",8));
//        a.add(new Test("time",11));
//        a.add(new Test("time",16));
//        a.add(new Test("time",17));
//        a.add(new Test("time",29));
//        a.add(new Test("time",34));
//        a.add(new Test("time",39));
//
//        List<Test> li=new ArrayList();
//        li.add(new Test("line",3));
//        li.add(new Test("line",7));
//        li.add(new Test("line",12));
//        li.add(new Test("line",17));
//        li.add(new Test("line",19));
//        li.add(new Test("line",31));
//        li.add(new Test("line",40));
//            a.forEach(in->{                                   //in  --->>>  1 , 5 ,8 ,11
//            int site=1;
//            int twoSite=1;
//            for(Test te:li){                                  //te   --->>> 3, 7 ,12 ,17
//                for(int i=0;i<20;i++){
//                    if(te.getNumber()+i==in.getNumber()){
//                        res.add(new Test2(te,in));
//                        site+=1;
//                        li.remove(te);
//                        break;
//                    }else {
//                        if(te.getNumber()-i==in.getNumber()){
//                            res.add(new Test2(te,in));
//                            site+=1;
//                            li.remove(te);
//                            break;
//                        }
//                    }
//                    twoSite+=1;
//                }
//                if(site>1){
//                    break;
//                }
//            }
//        });
//
//for(int i=0;i<res.size();i++){
//    for(int i1=0;i1<a.size();i1++){
//        if((res.get(i).getTe().getNumber()-res.get(i).getTes().getNumber())<(res.get(i).getTe().getNumber()-a.get(i1).getNumber())){
//            continue;
//        }else {
//            int big=0;
//            int small=0;
//            if(res.get(i).getTe().getNumber()>a.get(i1).getNumber()){
//                big=res.get(i).getTe().getNumber();
//                small=a.get(i1).getNumber();
//            }else{
//                small=res.get(i).getTe().getNumber();
//                big=a.get(i1).getNumber();
//            }
//
//            if((res.get(i).getTe().getNumber()-res.get(i).getTes().getNumber())<(big-small)){
//              continue;
//            }else if((res.get(i).getTe().getNumber()-res.get(i).getTes().getNumber())==(big-small)){
//                res.get(i).setTes(a.get(i1+1));
//                break;
//            }
//        }
//    }
//}
//        System.out.println(res);
//    }


    public static void main(String[] args)   {
        try {
        Scanner sca =new Scanner(System.in);

        sca.useDelimiter("\n");
        String abc=sca.next();
        System.out.println(abc);

            SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat sd = new java.text.SimpleDateFormat("yyyy-MM-dd");
            Date loginTime = sdf.parse(abc);
            Date day=sd.parse(abc);
            String time=sdf.format(loginTime);

            String Hourstime=time.substring(11,time.length());

            System.out.println(loginTime+",,,"+time+",,,"+Hourstime+",,,,"+day);

        } catch (ParseException e) {
            e.printStackTrace();
        }

    }
   }

